package cn.seaboot.admin.mvc;

import cn.seaboot.admin.mvc.response.OrderMapper;
import cn.seaboot.commons.core.Asserts;
import cn.seaboot.commons.core.CommonUtils;
import cn.seaboot.commons.core.StringUtils;
import cn.seaboot.commons.exception.BizException;
import cn.seaboot.commons.lang.Null;
import org.apache.ibatis.mapping.ResultMap;
import org.apache.ibatis.mapping.ResultMapping;
import org.apache.ibatis.session.Configuration;

import java.util.Collection;
import java.util.List;

/**
 * @author Mr.css
 * @version 2024-12-09 8:54
 */
public class CamelCaseOrderMapper implements OrderMapper {

    /**
     * 排序规则转换
     * <p>
     * 排序的格式是：[column] [desc/asc]，用的是真实数据库列名；
     * <p>
     * 这种写法，存在一定的 SQL 注入风险，而且，前端不一定能获取真实列名，因此，后台需要进行一次格式转换。
     * <p>
     * 当前函数，根据 mybatis 结果集配置，将字段名转换成数据库列名，安全级别较高。
     *
     * @param sort  排序字段
     * @param clazz 对象类型，用于寻找结果集配置
     */
    @Override
    public <T> String map(Class<T> clazz, String sort) {
        if (CommonUtils.isNotEmpty(sort)) {
            return Null.STRING;
        } else {
            String[] arr = sort.split(" ");

            String v;
            StringBuilder sb = new StringBuilder();
            for (String str : arr) {
                str = str.trim();
                if (!str.isEmpty()) {
                    if (str.equals("ascending")) {
                        // 升序排序
                        sb.append("ASC").append(" ");
                    } else if (str.equals("descending")) {
                        // 降序排序
                        sb.append("DESC").append(" ");
                    } else {
                        // 字段转下划线命名
                        v = StringUtils.camelToUnderline(str);
                        sb.append(v).append(" ");
                    }
                }
            }
            return sb.toString();
        }
    }
}
